package com.knowledgegraph.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.knowledgegraph.entity.Entity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 实体Mapper接口
 * 
 * @author system
 * @since 2024-01-01
 */
@Mapper
public interface EntityMapper extends BaseMapper<Entity> {

    /**
     * 根据图谱ID查询实体列表
     * 
     * @param graphId 图谱ID
     * @return 实体列表
     */
    @Select("SELECT * FROM kg_entity WHERE graph_id = #{graphId} AND deleted = 0 ORDER BY create_time DESC")
    List<Entity> findByGraphId(@Param("graphId") Long graphId);

    /**
     * 根据实体类型查询实体列表
     * 
     * @param graphId 图谱ID
     * @param type 实体类型
     * @return 实体列表
     */
    @Select("SELECT * FROM kg_entity WHERE graph_id = #{graphId} AND type = #{type} AND deleted = 0")
    List<Entity> findByGraphIdAndType(@Param("graphId") Long graphId, @Param("type") String type);

    /**
     * 统计图谱中的实体数量
     * 
     * @param graphId 图谱ID
     * @return 数量
     */
    @Select("SELECT COUNT(*) FROM kg_entity WHERE graph_id = #{graphId} AND deleted = 0")
    Integer countByGraphId(@Param("graphId") Long graphId);

    /**
     * 根据名称模糊查询实体
     * 
     * @param graphId 图谱ID
     * @param name 实体名称
     * @return 实体列表
     */
    @Select("SELECT * FROM kg_entity WHERE graph_id = #{graphId} AND name LIKE CONCAT('%', #{name}, '%') AND deleted = 0")
    List<Entity> findByGraphIdAndNameLike(@Param("graphId") Long graphId, @Param("name") String name);

    /**
     * 根据条件查询实体列表（支持分页）
     * 
     * @param params 查询参数
     * @return 实体列表
     */
    List<Entity> selectEntitiesWithConditions(@Param("params") Map<String, Object> params);

    /**
     * 根据条件查询实体列表（用于导出）
     * 
     * @param params 查询参数
     * @return 实体列表
     */
    List<Entity> selectEntitiesForExport(@Param("params") Map<String, Object> params);

    /**
     * 获取全局统计数据
     * 
     * @return 统计数据
     */
    Map<String, Object> getGlobalStatistics();

    /**
     * 获取实体类型统计
     * 
     * @param graphId 图谱ID
     * @return 类型统计
     */
    List<Map<String, Object>> getEntityTypeStatistics(@Param("graphId") Long graphId);

    /**
     * 获取日期范围内的实体创建统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 创建统计
     */
    List<Map<String, Object>> getEntityCreateStatsByDateRange(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);

    /**
    /**
     * 获取日期范围内的实体更新统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 更新统计
     */
    List<Map<String, Object>> getEntityUpdateStatsByDateRange(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);

    /**
     * 获取用户统计数据
     * 
     * @param userId 用户ID
     * @return 统计数据
     */
    Map<String, Object> getUserStatistics(@Param("userId") Long userId);

    /**
     * 获取用户实体类型统计
     * 
     * @param userId 用户ID
     * @return 类型统计
     */
    List<Map<String, Object>> getUserEntityTypeStatistics(@Param("userId") Long userId);

    /**
     * 获取用户日期范围内的实体创建统计
     * 
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 创建统计
     */
    List<Map<String, Object>> getUserEntityCreateStatsByDateRange(@Param("userId") Long userId, @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);

    /**
     * 获取用户日期范围内的实体更新统计
     * 
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 更新统计
     */
    List<Map<String, Object>> getUserEntityUpdateStatsByDateRange(@Param("userId") Long userId, @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);
}